home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MEMORY.SWG / 0064_PROTECTED MODE Stuff.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  4KB  |  141 lines

  1. {
  2.  SM> I have a bit of a problem with pascal 7 protected mode,
  3.  SM> I have a TSR (assembly) that does my comms work for me.
  4.  SM> I use intr(regs) with various settings to the registers to collect
  5.  SM> data from the TSR. However when in protected mode my TSR seems
  6.  SM> to be unavailable.
  7.  
  8.  SM> Do I need to switch to real mode from the app.
  9.  SM> (if so how, I can't find it in the manual).
  10.  
  11. Yes. This is not documented in the manual, though.
  12.  
  13.  SM> Do I need to modify my TSR.
  14.  SM> I presume not because I'm sure that the mouse drivers can be got
  15.  SM> to work.
  16.  
  17. The problem is that interrupt calls in protected mode use
  18. protected mode interrupt handlers. RTM.EXE converts protected
  19. mode interrupts to real mode ones, for 'known' interrupts
  20. (ie INT $21, some functions of INT $10, INT $33 (mouse)...)
  21.  
  22. What you need is to call the DPMI function that lets you issue
  23. a real mode interrupt. What follows should help you (let me know
  24. if it's not clear enough;-))
  25. }
  26.  
  27. { DPMI tools }
  28.  
  29. {$X+,G+}
  30.  
  31. {$IfNDef DPMI}
  32.      You don't need that.
  33. {$EndIf}
  34.  
  35. Unit MinDPMI;
  36.  
  37. Interface
  38.  
  39. Type TRealModeRegs =
  40.      Record
  41.           Case Integer Of
  42.           0: ( EDI, ESI, EBP, EXX, EBX, EDX, ECX, EAX: Longint;
  43.                Flags, ES, DS, FS, GS, IP, CS, SP, SS: Word);
  44.           1: ( DI,DIH, SI, SIH, BP, BPH, XX, XXH: Word;
  45.                Case Integer of
  46.                  0: (BX, BXH, DX, DXH, CX, CXH, AX, AXH: Word);
  47.                  1: (BL, BH, BLH, BHH, DL, DH, DLH, DHH,
  48.                      CL, CH, CLH, CHH, AL, AH, ALH, AHH: Byte));
  49.      End;
  50.  
  51.      TLowMemoryBlock     =
  52.      Record
  53.           ProtectedPtr   : Pointer;
  54.           RealSegment    : Word;
  55.           Size           : Word;
  56.      End;
  57.  
  58. Procedure ClearRegs(Var RealRegs : TRealModeRegs);
  59.  
  60. Function RealModeInt(    IntNo          : Byte;
  61.                          Var RealRegs   : TRealModeRegs) : Boolean;
  62. { IMPORTANT notes :
  63.      - If SS and SP in RealRegs are set to 0, the DPMI server provides
  64.        a 30 bytes stack. If not, the specified stack is used.    }
  65.  
  66. Procedure AllocateLowMem(Var Pt : TLowMemoryBlock; Size : Word);
  67. Procedure FreeLowMem(Var Pt : TLowMemoryBlock);
  68.  
  69. Procedure SetProtectedIntVec(No : Byte; p : Pointer);
  70. Procedure GetProtectedIntVec(No : Byte; Var p : Pointer);
  71.  
  72. Implementation
  73.  
  74. Uses WinAPI;
  75.  
  76. Type TDouble   =
  77.      Record
  78.           Lo, Hi    : Word;
  79.      End;
  80.  
  81. Procedure ClearRegs;
  82. Begin
  83.      FillChar(RealRegs, SizeOf(RealRegs), 0);
  84. End;
  85.  
  86. Function RealModeInt(    IntNo          : Byte;
  87.                          Var RealRegs   : TRealModeRegs) : Boolean;
  88. Assembler;
  89. Asm
  90.      Mov  AX, $0300
  91.      Mov  BL, IntNo
  92.      XOr  BH, BH
  93.      XOr  CX, CX
  94.      LES  DI, RealRegs
  95.      Int  $31
  96.      Mov  AX, 0               { Not XOr }
  97.      JNC  @Ok
  98.      Inc  AX
  99. @Ok:
  100.      Or   AX, AX
  101. End;
  102.  
  103. Procedure AllocateLowMem;
  104. Var  Adr  : LongInt;
  105. Begin
  106.      Adr:=GlobalDOSAlloc(Size);
  107.      If Adr=0 Then Size:=0;
  108.      Pt.ProtectedPtr:=Ptr(TDouble(Adr).Lo, 0);
  109.      Pt.RealSegment:=TDouble(Adr).Hi;
  110.      Pt.Size:=Size;
  111. End;
  112.  
  113. Procedure FreeLowMem;
  114. Begin
  115.      GlobalDOSFree(Seg(Pt.ProtectedPtr^));
  116.      FillChar(Pt, SizeOf(Pt), 0);           { Fills with NIL }
  117. End;
  118.  
  119. Procedure SetProtectedIntVec(No : Byte; p : Pointer); Assembler;
  120. Asm
  121.      Mov  AX, $0205
  122.      Mov  BL, No
  123.      Mov  CX, TDouble[p].Hi        { Selector }
  124.      Mov  DX, TDouble[p].Lo        { Offset }
  125.      Int  $31
  126. End;
  127.  
  128. Procedure GetProtectedIntVec(No : Byte; Var p : Pointer); Assembler;
  129. Asm
  130.      Mov  AX, $0204
  131.      Mov  BL, No
  132.      Int  $31
  133.      LES  DI, p
  134.      { Mov  ES:[DI], DX }
  135.      { Mov  ES:[DI+2], CX }
  136.      Mov  TDouble[ES:DI].Lo, DX
  137.      Mov  TDouble[ES:DI].Hi, CX
  138. End;
  139.  
  140. End.
  141.